/**
 * 支付宝支付回调地址
 */
import { ICommonParams } from '@feidao/service/interfaces';
import log from '@feidao/web/atom/nodejs/logger/log';

interface IAliJSON {
	notify_time: Date; // 通知的发送时间。格式为yyyy-MM-dd HH:mm:ss
	notify_type: string; // 通知的类型
	notify_id: string; // 通知校验ID
	charset: string; // 编码格式，如utf-8、gbk、gb2312等  电脑网站支付
	version: string; // 调用的接口版本，固定为：1.0	 电脑网站支付
	sign_type: string; // 签名算法类型，目前支持RSA2和RSA，推荐使用RSA2
	sign: string; // 签名  请参考异步返回结果的验签
	auth_app_id: string; // 授权方的appid，由于本接口暂不开放第三方应用授权，因此auth_app_id=app_id 电脑网站支付

	trade_no: string; // 支付宝交易号
	app_id: string; // 开发者的app_id
	out_trade_no: string; // 商户订单号
	out_biz_no: string; // 商户业务号
	buyer_id: string; // 买家支付宝用户号
	buyer_logon_id: string; // 买家支付宝账号  当面付  app支付  手机网站支付
	seller_id: string; // 卖家支付宝用户号
	seller_email: string; // 卖家支付宝账号  当面付  app支付  手机网站支付
	trade_status: string; // 交易目前所处的状态
	total_amount: number; // 本次交易支付的订单金额，单位为人民币（元）
	receipt_amount: number; // 商家在交易中实际收到的款项，单位为元
	invoice_amount: number; // 用户在交易中支付的可开发票的金额
	buyer_pay_amount: number; // 用户在交易中支付的金额
	point_amount: number; // 使用集分宝支付的金额
	refund_fee: number; // 退款通知中，返回总退款金额，单位为元，支持两位小数
	send_back_fee: number; // 商户实际退款给用户的金额，单位为元，支持两位小数
	subject: string; // 商品的标题/交易标题/订单标题/订单关键字等，是请求时对应的参数，原样通知回来
	body: string; // 该订单的备注、描述、明细等。对应请求时的body参数，原样通知回来
	gmt_create: Date; // 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss
	gmt_payment: Date; // 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss
	gmt_refund: Date; // 该笔交易的退款时间。格式为yyyy-MM-dd HH:mm:ss.S
	gmt_close: Date; // 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss
	fund_bill_list: string; // 支付成功的各个渠道金额信息，详见资金明细信息说明
	voucher_detail_list: string; // 本交易支付时所使用的所有优惠券信息，详见优惠券信息说明  电脑网站支付
	passback_params: string; // 公共回传参数，如果请求时传递了该参数，则返回给商户时会在异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝  电脑网站支付
}


/**
 * 获取支付宝附带信息
 * @param data
 * @param pay_type
 */
function getAttachData(data: IAliJSON, pay_type: string) {
	let attach_data = null;
	switch (pay_type) {
		case 'web':
			attach_data = data.passback_params;
			attach_data = decodeURIComponent(attach_data);
			break;
		case 'mobile':
			attach_data = data.passback_params;
			attach_data = decodeURIComponent(attach_data);
			break;
		case 'app':
			attach_data = data.passback_params;
			break;
		case 'scancode':
			attach_data = data.body;
			break;
		default:
	}
	return attach_data ? JSON.parse(attach_data) : {};
}

// 支付处理
async function pay_process(data: IAliJSON, _spaceid: string, attachdata: object) {
	// todo 做支付处理
}

export default async function atom(msg: ICommonParams, action_id: string, session_id: string, _spaceid: string) {
	const headers = msg.headers;
	log('支付宝保存数据服务开始');

	const pay_type = msg.params && msg.params.paytype;
	log(`支付宝支付方式--:${pay_type}`);
	const spaceid = msg.spaceid;
	try {
		const data = msg.body as IAliJSON;
		log('ali callback:');
		log(JSON.stringify(data));
		// 获取支付宝附带参数
		const attachdata = getAttachData(data, pay_type);
		// 逻辑处理
		pay_process(data, spaceid, attachdata);

		return { data: 'success' };
	} catch (error) {
		const err_msg = (error && error.toString()) || 'unknown';
		log(`支付宝回调执行异常:${pay_type},${err_msg}`);
		// 支付宝支付回调成功，返回内容固定都是fail
		return { data: 'fail' };
	}
}
